package org.example.nio.channel;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * 使用nio进行文件复制的案例
 * 此案例效率还不是最高的，channel的transferFrom方法效率会更高
 *
 * @author hh
 * @since 2024/10/27
 */
public class TestFileChannel {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("/Users/hh/test/in.txt");
             FileOutputStream fos = new FileOutputStream("/Users/hh/test/out.txt")){
            FileChannel fileInputChannel = fis.getChannel();
            FileChannel fileOutChannel = fos.getChannel();
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            int length = -1;
            // 此时buffer处于写模式
            while ((length = fileInputChannel.read(buffer)) != -1) {
                // 翻转buffer，使其变成读模式（必须处于读模式，不能处于写模式）
                buffer.flip();
                int outLength = 0;
                // 调用write()，将buffer的数据写入通道
                while ((outLength = fileOutChannel.write(buffer)) != 0) {
                    System.out.println("写入的字节数：" + outLength);
                }
                // buffer第二次模式切换：清除buffer，变成写模式
                buffer.clear();
            }
            // 强制刷新到磁盘
            fileOutChannel.force(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
